package controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;

import javax.swing.plaf.PanelUI;

import modelo.Competencia;
import modelo.Juez;
import modelo.Modalidad;
import modelo.Nadador;
import modelo.NadadorCompetencia;
import modelo.Panamericano;
import modelo.TipoCompetencia;

import vista.VentanaPrincipal;

public class ControladorVentanaPrincipal implements ActionListener {

	VentanaPrincipal ventanaPrincipal;	
	Panamericano panamericano;	
	ControladorVentanaAgregarJuez controladorVentanaJuez;
	int codigoCompetencia;
	Date fechaActual = new Date();
	Calendar calendario = Calendar.getInstance();
	int noCompetenciaActual;
	
	// variables auxiliares globales para ser usadas en los metodos
	ArrayList<Juez> auxJueces;
	
	// masculinos y femeninos de c/equipo
	ArrayList<Nadador> masculinos1 = new ArrayList<Nadador>();
	ArrayList<Nadador> femeninos1 = new ArrayList<Nadador>();
			
	ArrayList<Nadador> masculinos2 = new ArrayList<Nadador>();
	ArrayList<Nadador> femeninos2 = new ArrayList<Nadador>();
			
	ArrayList<Nadador> masculinos3 = new ArrayList<Nadador>();
	ArrayList<Nadador> femeninos3 = new ArrayList<Nadador>();
			
	ArrayList<Nadador> masculinos4 = new ArrayList<Nadador>();
	ArrayList<Nadador> femeninos4 = new ArrayList<Nadador>();
			
	ArrayList<Nadador> masculinos5 = new ArrayList<Nadador>();
	ArrayList<Nadador> femeninos5 = new ArrayList<Nadador>();
			
	ArrayList<Nadador> masculinos6 = new ArrayList<Nadador>();
	ArrayList<Nadador> femeninos6 = new ArrayList<Nadador>();
			
	ArrayList<Nadador> masculinos7 = new ArrayList<Nadador>();
	ArrayList<Nadador> femeninos7 = new ArrayList<Nadador>();
			
	ArrayList<Nadador> masculinos8 = new ArrayList<Nadador>();
	ArrayList<Nadador> femeninos8 = new ArrayList<Nadador>();
	
	
	// constructor
	public ControladorVentanaPrincipal(){
		
		
		// instanciamos al modelo (donde estaran los ArrayLists)
		panamericano = new Panamericano();
		
		// mostramos la ventana
		ventanaPrincipal = new VentanaPrincipal();
		ventanaPrincipal.setLocationRelativeTo(null);
		ventanaPrincipal.setVisible(true);
		ventanaPrincipal.agregarListener(this);
		this.codigoCompetencia=1;
		// auxiliar de jueces para garantizar que todos participen 
		auxJueces = new ArrayList<Juez>();
		// restamos un dia para que cumpla con la funcion de un dia para cada modalidad
		calendario.add(Calendar.DAY_OF_MONTH, -1);
		
	}
	
	
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
				
		if (e.getActionCommand().equalsIgnoreCase("Cargar Nadadores"))
		{
			ControladorVentanaCargarEquipo contraldorVentanaCargarEquipo = 
						new ControladorVentanaCargarEquipo (panamericano);
		}
		// si se selcciono el menu registrar juez...
		else if (e.getActionCommand().equalsIgnoreCase("Registrar Juez"))
		{
			controladorVentanaJuez = new ControladorVentanaAgregarJuez(panamericano);
		}
		
		else if (e.getActionCommand().equalsIgnoreCase("Iniciar Juegos")){
			
			if((this.panamericano.cantidadEquipos()==8) && (this.panamericano.cantidadJueces()>0)){
				// generando el codigo
				generarJuegos();
				this.ventanaPrincipal.activarIniciarJuego(false);
				noCompetenciaActual=0;
			}
			else{
				this.ventanaPrincipal.mostrarMensaje("Error: Debe registrar los 8 equipos y jueces");
			}
			
		}
		else if (e.getActionCommand().equalsIgnoreCase("Posicion de Equipos")){
			ControladorEquiposGanadores controladorEquiposGanadores =
					new ControladorEquiposGanadores(this.panamericano);
		}
		
		else if(e.getActionCommand().equalsIgnoreCase("Resultados")){
			
			ControladorVentanaResultados controladorVentanaResultados;
			controladorVentanaResultados = new ControladorVentanaResultados(this.panamericano);
			
		}
		
		else if (e.getActionCommand().equalsIgnoreCase("Salir"))
		{
			System.exit(0);
		}
	}
	
	
	
	// ?'***********************************************
	
	private void imprimirH(){
		for (int i=0; i<masculinos1.size();i++){
			System.out.println(masculinos1.get(i).getApellido() + " " + masculinos2.get(i).getApellido() + " " + masculinos3.get(i).getApellido() + " " + masculinos4.get(i).getApellido() + " " + masculinos5.get(i).getApellido() + " " + masculinos6.get(i).getApellido() + " " + masculinos7.get(i).getApellido() + " " +masculinos8.get(i).getApellido() );
		}
	}
	
	private void imprimirM(){
		for (int i=0; i<masculinos1.size();i++){
			System.out.println(femeninos1.get(i).getApellido() + " " + femeninos2.get(i).getApellido() + " " + femeninos3.get(i).getApellido() + " " + femeninos4.get(i).getApellido() + " " + femeninos5.get(i).getApellido() + " " + femeninos6.get(i).getApellido() + " " + femeninos7.get(i).getApellido() + " " +femeninos8.get(i).getApellido() );
		}
	}
	
	
	// ?'***********************************************
	@SuppressWarnings("deprecation")
	private void generarJuegos(){
		
//		// copiamos los jueces al auxiliar 
//		auxJueces = panamericano.getTodosTmpJueces();
		// restamos un dia a la fecha para ser usada en la funcion 
		int dia =fechaActual.getDate();
		noCompetenciaActual++;
		
		
		
		// separamos los equipos, masculinos y femeninos de cada equipo cargados del txt
		separarNadadoresPorSexo();		// inicializamos los grupos de nadadores masculinos y femeninos 

		generarModalidad("Libre","Masculino",50,masculinos1,masculinos2,masculinos3,masculinos4,masculinos5,masculinos6,masculinos7,masculinos8);
		generarModalidad("Libre","Femenino",50,femeninos1,femeninos2,femeninos3,femeninos4,femeninos5,femeninos6,femeninos7,femeninos8);
		
		separarNadadoresPorSexo();

		generarModalidad("Libre","Masculino",100,masculinos1,masculinos2,masculinos3,masculinos4,masculinos5,masculinos6,masculinos7,masculinos8);
		generarModalidad("Libre","Femenino",100,femeninos1,femeninos2,femeninos3,femeninos4,femeninos5,femeninos6,femeninos7,femeninos8);
		
		// estilo Pecho dia 2
		//fechaActual.setDate( dia +1);
		separarNadadoresPorSexo();

		generarModalidad("Pecho","Masculino",50,masculinos1,masculinos2,masculinos3,masculinos4,masculinos5,masculinos6,masculinos7,masculinos8);
		generarModalidad("Pecho","Femenino",50,femeninos1,femeninos2,femeninos3,femeninos4,femeninos5,femeninos6,femeninos7,femeninos8);
		
		separarNadadoresPorSexo();

		generarModalidad("Pecho","Masculino",100,masculinos1,masculinos2,masculinos3,masculinos4,masculinos5,masculinos6,masculinos7,masculinos8);
		generarModalidad("Pecho","Femenino",100,femeninos1,femeninos2,femeninos3,femeninos4,femeninos5,femeninos6,femeninos7,femeninos8);
		
		// estilo Espalda dia 3
		//fechaActual.setDate( dia +1);
		separarNadadoresPorSexo();

		generarModalidad("Espalda","Masculino",50,masculinos1,masculinos2,masculinos3,masculinos4,masculinos5,masculinos6,masculinos7,masculinos8);
		generarModalidad("Espalda","Femenino",50,femeninos1,femeninos2,femeninos3,femeninos4,femeninos5,femeninos6,femeninos7,femeninos8);
		
		separarNadadoresPorSexo();
	
		generarModalidad("Espalda","Masculino",100,masculinos1,masculinos2,masculinos3,masculinos4,masculinos5,masculinos6,masculinos7,masculinos8);
		generarModalidad("Espalda","Femenino",100,femeninos1,femeninos2,femeninos3,femeninos4,femeninos5,femeninos6,femeninos7,femeninos8);
				
		// estilo Mariposa dia 4
		//fechaActual.setDate( dia +1);
		separarNadadoresPorSexo();

		generarModalidad("Mariposa","Masculino",50,masculinos1,masculinos2,masculinos3,masculinos4,masculinos5,masculinos6,masculinos7,masculinos8);
		generarModalidad("Mariposa","Femenino",50,femeninos1,femeninos2,femeninos3,femeninos4,femeninos5,femeninos6,femeninos7,femeninos8);
		
		separarNadadoresPorSexo();

		generarModalidad("Mariposa","Masculino",100,masculinos1,masculinos2,masculinos3,masculinos4,masculinos5,masculinos6,masculinos7,masculinos8);
		generarModalidad("Mariposa","Femenino",100,femeninos1,femeninos2,femeninos3,femeninos4,femeninos5,femeninos6,femeninos7,femeninos8);
						
				 
		
		
	}
	
	private void generarModalidad(String estilo, String Sexo, int distancia, ArrayList<Nadador> masculinos1,ArrayList<Nadador> masculinos2,
			ArrayList<Nadador> masculinos3, ArrayList<Nadador> masculinos4,ArrayList<Nadador> masculinos5,ArrayList<Nadador> masculinos6, 
			ArrayList<Nadador> masculinos7,	ArrayList<Nadador> masculinos8)
	{
		// 8 carriles...
		ArrayList carriles;
		
		
		Competencia competencia;
		NadadorCompetencia nadadorCompetencia;
		String strCodigo;
		String modalidadCompetencia;
		
		// el dia de la competencia
		calendario.add(Calendar.DAY_OF_MONTH, 1);
		// empezamos la competencia a las 8:00 am
		calendario.set(Calendar.HOUR, 8);
		calendario.set(Calendar.MINUTE, 00);
		
		int nivel =1;
		// para las 4 Eliminatorias

		for (int i=0; i<4; i++) {
			// limpiamos los 8 carriles como disponibles
			carriles = new ArrayList();
			for (int m=0; m<8;m++){
				carriles.add(m);
			}


			strCodigo = String.valueOf( codigoCompetencia);
			modalidadCompetencia = estilo + " " + String.valueOf(distancia) + " Metros " + Sexo; 
		
			competencia = new Competencia( strCodigo,calendario.getTime() , modalidadCompetencia,nivel);
			
			// generamos el obj nadadorCompetencia con su carril, a partir de un nadador aleatorio de c/equipo
			nadadorCompetencia = crearNadadorCompetencia(masculinos1,carriles,distancia,estilo);
			// asignamos el tiempo sea de 50 o de 100 metros respectivamente
			if (distancia==50){
				nadadorCompetencia.setTiempo(calcularTiemporAleatorio_50());
			}
			else{
				nadadorCompetencia.setTiempo(calcularTiemporAleatorio_100());
			}
			// agregamos ese nadador a la competencia
			competencia.agregarNadadorCompetencia(nadadorCompetencia);
			// nadador aleatorio del equipo 2
			nadadorCompetencia = crearNadadorCompetencia(masculinos2,carriles,distancia,estilo);
			if (distancia==50){
				nadadorCompetencia.setTiempo(calcularTiemporAleatorio_50());
			}
			else{
				nadadorCompetencia.setTiempo(calcularTiemporAleatorio_100());
			}
			competencia.agregarNadadorCompetencia(nadadorCompetencia);
			
			// nadador aleatorio del equipo 3
			nadadorCompetencia = crearNadadorCompetencia(masculinos3,carriles,distancia,estilo);
			if (distancia==50){
				nadadorCompetencia.setTiempo(calcularTiemporAleatorio_50());
			}
			else{
				nadadorCompetencia.setTiempo(calcularTiemporAleatorio_100());
			}
			competencia.agregarNadadorCompetencia(nadadorCompetencia);
			
			// nadador aleatorio del equipo 4
			nadadorCompetencia = crearNadadorCompetencia(masculinos4,carriles,distancia,estilo);
			if (distancia==50){
				nadadorCompetencia.setTiempo(calcularTiemporAleatorio_50());
			}
			else{
				nadadorCompetencia.setTiempo(calcularTiemporAleatorio_100());
			}
			competencia.agregarNadadorCompetencia(nadadorCompetencia);
			
			// nadador aleatorio del equipo 5
			nadadorCompetencia = crearNadadorCompetencia(masculinos5,carriles,distancia,estilo);
			
			if (distancia==50){
				nadadorCompetencia.setTiempo(calcularTiemporAleatorio_50());
			}
			else{
				nadadorCompetencia.setTiempo(calcularTiemporAleatorio_100());
			}			
			competencia.agregarNadadorCompetencia(nadadorCompetencia);
			
			// nadador aleatorio del equipo 6
			nadadorCompetencia = crearNadadorCompetencia(masculinos6,carriles,distancia,estilo);
			if (distancia==50){
				nadadorCompetencia.setTiempo(calcularTiemporAleatorio_50());
			}
			else{
				nadadorCompetencia.setTiempo(calcularTiemporAleatorio_100());
			}
			competencia.agregarNadadorCompetencia(nadadorCompetencia);
			
			// nadador aleatorio del equipo 7
			nadadorCompetencia = crearNadadorCompetencia(masculinos7,carriles,distancia,estilo);
			if (distancia==50){
				nadadorCompetencia.setTiempo(calcularTiemporAleatorio_50());
			}
			else{
				nadadorCompetencia.setTiempo(calcularTiemporAleatorio_100());
			}
			competencia.agregarNadadorCompetencia(nadadorCompetencia);

			// nadador aleatorio del equipo 8
			nadadorCompetencia = crearNadadorCompetencia(masculinos8,carriles,distancia,estilo);
			if (distancia==50){
				nadadorCompetencia.setTiempo(calcularTiemporAleatorio_50());
			}
			else{
				nadadorCompetencia.setTiempo(calcularTiemporAleatorio_100());
			}
			competencia.agregarNadadorCompetencia(nadadorCompetencia);
			
			
// boorrar
//System.out.println("Total jueces en pan: " +panamericano.getJueces().size());			
			// agregamos al juez  para garantizar que todos participen!
			competencia.setJuez( juezAleatorioAuxiliar());
			
						
			// ordenamos
			// guardamos en la competencia los nadadores ordenados, con sus posiciones!

			ordenarTiempos(competencia.getTodosNadadoresCompetencia());
			
			// agregamos la competencia al panamericano 
			this.panamericano.agregarCompetencia(competencia);
			
			nivel++; // Los 4 Niveles seran para (eliminatoria A,B,C,D)
			
			this.codigoCompetencia++;
			noCompetenciaActual++;
			// media hora mas para la otra competencia
			calendario.add(Calendar.MINUTE, 30);

		}// for de las 4 eliminatorias
		
		// codigo y hora actual para la semifinal A
		//Competencia tmpCompetencia;
		
		// limpiamos los 8 carriles como disponibles
		carriles = new ArrayList();
		for (int m=0; m<8;m++){
			carriles.add(m);
		}

		strCodigo = String.valueOf( codigoCompetencia);
		modalidadCompetencia = estilo + " " + String.valueOf(distancia) + " Metros " + Sexo;
	
		Competencia competenciaA = new Competencia( strCodigo,calendario.getTime() , modalidadCompetencia,nivel);

		// nadadores en los de las eliminatorias A y B y se realizan los calculos	

		generarSemifinalA(competenciaA,distancia,carriles);
		
		// agregamos al juez usamos los del aux para garantizar que todos participen!
		competenciaA.setJuez( juezAleatorioAuxiliar());
		// en este punto ya estan los los nadadores de la Semifinal A con sus tiempos ordenados y juez		
		// agrego esa competencia al panamericano
		this.panamericano.agregarCompetencia(competenciaA);
		
		
		// actualizamos los datos para la semifinal B
		nivel++; // Los 2 Niveles seran para (Semifinal A=5,B=6, Final=7)		
		this.codigoCompetencia++;
		noCompetenciaActual++;
		
		// generando la Semifinal-B

		// limpiamos los 8 carriles como disponibles
		carriles = new ArrayList();
		for (int m=0; m<8;m++){
			carriles.add(m);
		}
		
		strCodigo = String.valueOf( codigoCompetencia);
		modalidadCompetencia = estilo + " " + String.valueOf(distancia) + " Metros " + Sexo;
	
		Competencia competenciaB = new Competencia( strCodigo,calendario.getTime() , modalidadCompetencia,nivel);
		
		// nadadores en los de las eliminatorias C y D y se realizan los calculos
		generarSemifinalB(competenciaB,distancia, carriles);
		
		// agregamos al juez usamos los del aux para garantizar que todos participen!
		competenciaB.setJuez( juezAleatorioAuxiliar());
		
		// en este punto ya estan los los nadadores de la Semifinal B con sus tiempos ordenados y juez		
		// agrego esa competencia al panamericano
		this.panamericano.agregarCompetencia(competenciaB);
		
		
		// actualizamos los datos para la FINAL	
		nivel++; // Los 2 Niveles seran para (Semifinal A=5,B=6, Final=7)		
		this.codigoCompetencia++;
		noCompetenciaActual++;
		
		calendario.add(Calendar.MINUTE, 30);// media hora mas para la Final

		
		// pasamos a la Final (nivel=7)
		
		// limpiamos los 8 carriles como disponibles
		carriles = new ArrayList();
		for (int m=0; m<8;m++){
			carriles.add(m);
		}

		
		strCodigo = String.valueOf( codigoCompetencia);
		modalidadCompetencia = estilo + " " + String.valueOf(distancia) + " Metros " + Sexo;
	
		Competencia competenciaF = new Competencia( strCodigo,calendario.getTime() , modalidadCompetencia,nivel);
				
		// nadadores en los de las eliminatorias A y B y se realizan los calculos
		generarFinal(competenciaF,distancia,carriles);
				
		// agregamos al juez usamos los del aux para garantizar que todos participen!
		competenciaF.setJuez( juezAleatorioAuxiliar());
		// en este punto ya estan los nadadores de la Final con sus tiempos ordenados y juez		
		// agrego esa competencia al panamericano
		this.panamericano.agregarCompetencia(competenciaF);
		
		
		noCompetenciaActual++;
		
	}
	
	private void generarFinal(Competencia competencia, int distancia, ArrayList carriles){
		
		// usa la info de las competencias 1 y 2 para la semifinal A
		
		Nadador tmpNadador;
						
		// los 4 primeros del arreglo ordenado son los clasificados para competir de la semifinal 1
		for (int k=0; k<4; k++){
			
			// competencia nivel 5= Semifinal-A
			tmpNadador = panamericano.getCompetencia(noCompetenciaActual-3).getNadadorCompetencia(k).getNadador();
			
			NadadorCompetencia tmpNadadorCompetencia2 = new NadadorCompetencia();
			tmpNadadorCompetencia2.setNadador(tmpNadador);
			
			// colocamos el tiempo a ese nadador
			if (distancia == 50){
				tmpNadadorCompetencia2.setTiempo(calcularTiemporAleatorio_50());
			}
			else{
				tmpNadadorCompetencia2.setTiempo(calcularTiemporAleatorio_100());
			}		
			// asignamos el carril
			int indiceCarril=(int)Math.floor(Math.random()* carriles.size()); // o cambiar 8...,3,2,1
			carriles.remove(indiceCarril);
			// carril aleatorio, eliminado del arraylist
			tmpNadadorCompetencia2.setCarril(indiceCarril);
			// agregamos ese nadador a la competencia
			competencia.agregarNadadorCompetencia(tmpNadadorCompetencia2);			
		}
		
		
		for (int k=0; k<4; k++){
	
			// competencia nivel 6= Semifinal-B
			tmpNadador = panamericano.getCompetencia(noCompetenciaActual-2).getNadadorCompetencia(k).getNadador();
			
			NadadorCompetencia tmpNadadorCompetencia2 = new NadadorCompetencia();
			tmpNadadorCompetencia2.setNadador(tmpNadador);
			
			// colocamos el tiempo a ese nadador
			if (distancia == 50){
				tmpNadadorCompetencia2.setTiempo(calcularTiemporAleatorio_50());
			}
			else{
				tmpNadadorCompetencia2.setTiempo(calcularTiemporAleatorio_100());
			}
			// asignamos el carril
			int indiceCarril=(int)Math.floor(Math.random()* carriles.size()); // o cambiar 8...,3,2,1
			carriles.remove(indiceCarril);
			// carril aleatorio, eliminado del arraylist
			tmpNadadorCompetencia2.setCarril(indiceCarril);
			// agregamos ese nadador a la competencia
			competencia.agregarNadadorCompetencia(tmpNadadorCompetencia2);			
		}
				
		// en este punto ya tenemos los 4 nadadores de cada Semifinal A y B
		// los ordenamos para asignar las posiciones de esa competencia

		ordenarTiempos(competencia.getTodosNadadoresCompetencia());	
		
		// sumamos las medallas a los nadadores y al equipo oro
		competencia.getNadadorCompetencia(0).getNadador().contarMedallaOro();
		String cedulaNadador = competencia.getNadadorCompetencia(0).getNadador().getCedula();
		this.panamericano.contarMedallaOroEquipo(cedulaNadador);
		// plata
		competencia.getNadadorCompetencia(1).getNadador().contarMedallaPlata();
		cedulaNadador = competencia.getNadadorCompetencia(1).getNadador().getCedula();
		this.panamericano.contarMedallaPlataEquipo(cedulaNadador);
		// bronce
		competencia.getNadadorCompetencia(2).getNadador().contarMedallaBronce();
		cedulaNadador = competencia.getNadadorCompetencia(2).getNadador().getCedula();
		this.panamericano.contarMedallaBronceEquipo(cedulaNadador);
	}
	
	
	private void generarSemifinalB(Competencia competencia, int distancia, ArrayList carriles){
		// usa la info de las competencias 1 y 2 para la semifinal A

		Nadador tmpNadador;
		
		// los 4 primeros del arreglo ordenado son los clasificados para competir de la semifinal 1
		for (int k=0; k<4; k++){
			
			// competencia nivel 3= eliminatoria-C
			tmpNadador = panamericano.getCompetencia(noCompetenciaActual-4).getNadadorCompetencia(k).getNadador();
			NadadorCompetencia tmpNadadorCompetencia2 = new NadadorCompetencia();
			tmpNadadorCompetencia2.setNadador(tmpNadador);
					
			
			// colocamos el tiempo a ese nadador
			if (distancia == 50){
				tmpNadadorCompetencia2.setTiempo(calcularTiemporAleatorio_50());
			}
			else{
				tmpNadadorCompetencia2.setTiempo(calcularTiemporAleatorio_100());
			}
			// asignamos el carril
			int indiceCarril=(int)Math.floor(Math.random()* carriles.size()); // o cambiar 8...,3,2,1
			carriles.remove(indiceCarril);
			// carril aleatorio, eliminado del arraylist
			tmpNadadorCompetencia2.setCarril(indiceCarril);
			// agregamos ese nadador a la competencia
			competencia.agregarNadadorCompetencia(tmpNadadorCompetencia2);			
		}
		
		
		
		
		for (int k=0; k<4; k++){
		
			// competencia 4= eliminatoria-D
			tmpNadador = panamericano.getCompetencia(noCompetenciaActual-3).getNadadorCompetencia(k).getNadador();
			// colocamos el tiempo a ese nadador
			NadadorCompetencia tmpNadadorCompetencia2 = new NadadorCompetencia();
			tmpNadadorCompetencia2.setNadador(tmpNadador);
			
			if (distancia == 50){
				tmpNadadorCompetencia2.setTiempo(calcularTiemporAleatorio_50());
			}
			else{
				tmpNadadorCompetencia2.setTiempo(calcularTiemporAleatorio_100());
			}
			// asignamos el carril
			int indiceCarril=(int)Math.floor(Math.random()* carriles.size()); // o cambiar 8...,3,2,1
			carriles.remove(indiceCarril);
			// carril aleatorio, eliminado del arraylist
			tmpNadadorCompetencia2.setCarril(indiceCarril);
			// agregamos ese nadador a la competencia
			competencia.agregarNadadorCompetencia(tmpNadadorCompetencia2);			
		}
		
		// en este punto ya tenemos los 4 nadadores de cada Eliminatoria A y B
		// los ordenamos para asignar las posiciones de esa competencia

		ordenarTiempos(competencia.getTodosNadadoresCompetencia());
	}
	
	private void generarSemifinalA(Competencia competencia, int distancia, ArrayList carriles){
		// usa la info de las competencias 1 y 2 para la semifinal A
		
		Nadador tmpNadador;
		
		// los 4 primeros del arreglo ordenado son los clasificados para competir de la semifinal 1
		for (int k=0; k<4; k++){
			// competencia nivel 1= eliminatoria-A
			
			tmpNadador = panamericano.getCompetencia(noCompetenciaActual-5).getNadadorCompetencia(k).getNadador();
			
			NadadorCompetencia tmpNadadorCompetencia2 = new NadadorCompetencia();
			tmpNadadorCompetencia2.setNadador(tmpNadador);
			
			// colocamos el tiempo a ese nadador
			if (distancia == 50){
				tmpNadadorCompetencia2.setTiempo(calcularTiemporAleatorio_50());
			}
			else{
				tmpNadadorCompetencia2.setTiempo(calcularTiemporAleatorio_100());
			}
			
			// asignamos el carril
			int indiceCarril=(int)Math.floor(Math.random()* carriles.size()); // o cambiar 8...,3,2,1
			carriles.remove(indiceCarril);
			// carril aleatorio, eliminado del arraylist
			tmpNadadorCompetencia2.setCarril(indiceCarril);
			// agregamos ese nadador a la competencia
			competencia.agregarNadadorCompetencia(tmpNadadorCompetencia2);			
		}
		
		
		for (int m=0; m<4; m++){
			
			// competencia 2= eliminatoria-B
			tmpNadador = panamericano.getCompetencia(noCompetenciaActual-4).getNadadorCompetencia(m).getNadador();
			NadadorCompetencia tmpNadadorCompetencia2 = new NadadorCompetencia();
			tmpNadadorCompetencia2.setNadador(tmpNadador);
			
			// colocamos el tiempo a ese nadador
			if (distancia == 50){
				tmpNadadorCompetencia2.setTiempo(calcularTiemporAleatorio_50());
			}
			else{
				tmpNadadorCompetencia2.setTiempo(calcularTiemporAleatorio_100());
			}
			// asignamos el carril
			int indiceCarril=(int)Math.floor(Math.random()* carriles.size()); // o cambiar 8...,3,2,1
			carriles.remove(indiceCarril);
			// carril aleatorio, eliminado del arraylist
			tmpNadadorCompetencia2.setCarril(indiceCarril);
			// agregamos ese nadador a la competencia
			competencia.agregarNadadorCompetencia(tmpNadadorCompetencia2);			
		}
		
		// en este punto ya tenemos los 4 nadadores de cada Eliminatoria A y B
		// los ordenamos para asignar las posiciones de esa competencia
		
		ordenarTiempos(competencia.getTodosNadadoresCompetencia());

	}
	

	
	private void separarNadadoresPorSexo(){
		
		for (int i=0; i< panamericano.cantidadEquipos(); i++){
			
			switch (i){
			
				case 0: masculinos1 = separarMasculinos(panamericano.getEquipos().get(i).getNadadores());
						femeninos1 = separarFemeninos(panamericano.getEquipos().get(i).getNadadores());
						break;
				case 1: masculinos2 = separarMasculinos(panamericano.getEquipos().get(i).getNadadores());
						femeninos2 = separarFemeninos(panamericano.getEquipos().get(i).getNadadores());
						break;
				case 2: masculinos3 = separarMasculinos(panamericano.getEquipos().get(i).getNadadores());
						femeninos3 = separarFemeninos(panamericano.getEquipos().get(i).getNadadores());
						break;
				case 3: masculinos4 = separarMasculinos(panamericano.getEquipos().get(i).getNadadores());
						femeninos4 = separarFemeninos(panamericano.getEquipos().get(i).getNadadores());
						break;
				case 4: masculinos5 = separarMasculinos(panamericano.getEquipos().get(i).getNadadores());
						femeninos5 = separarFemeninos(panamericano.getEquipos().get(i).getNadadores());
						break;
				case 5: masculinos6 = separarMasculinos(panamericano.getEquipos().get(i).getNadadores());
						femeninos6 = separarFemeninos(panamericano.getEquipos().get(i).getNadadores());
						break;
				case 6: masculinos7 = separarMasculinos(panamericano.getEquipos().get(i).getNadadores());
						femeninos7 = separarFemeninos(panamericano.getEquipos().get(i).getNadadores());
						break;
				
				case 7: masculinos8 = separarMasculinos(panamericano.getEquipos().get(i).getNadadores());
						femeninos8 = separarFemeninos(panamericano.getEquipos().get(i).getNadadores());
						break;
			
			}// switch
			
		} // for
		
	}
	
	
	private NadadorCompetencia crearNadadorCompetencia (ArrayList<Nadador> equipo, ArrayList carriles, int distancia, String modalidad){
		
		// metodo, que establece de manera aleatoria al nadadadorCompetencia y su carril
		
		
		// buscamos un nadadr aleatorio del equipo que enviamos por parametro, con los carriles disponibles
		// en el segundo parametro
		
		Nadador nadador;
		NadadorCompetencia nadadorCompetencia;
		TipoCompetencia objTipoCompetencia = new TipoCompetencia(distancia,modalidad);
		
		int indiceNadador=(int)Math.floor(Math.random()* equipo.size() ); // o  4,3,2,1
		nadador = equipo.get(indiceNadador);
		equipo.remove(indiceNadador);
		// nadador aleatorio guardado en la variable local, y eliminado del arraylist
		
		int indiceCarril=(int)Math.floor(Math.random()* carriles.size()); // o  8...,3,2,1
		carriles.remove(indiceCarril);
		// carril aleatorio, eliminado del arraylist
		
		nadadorCompetencia = new NadadorCompetencia(nadador, objTipoCompetencia, indiceCarril);
		
		// retornamos al nadadorAleatorio con el carril aleatorio
		return nadadorCompetencia;
		
	}
	
	private Juez juezAleatorioAuxiliar(){
		
		ArrayList<Juez> juecesSinParticipar = new ArrayList<Juez>();
		
		juecesSinParticipar = this.panamericano.getJuecesSinParticipar();
		
		Juez juez;
		String cedula;
		if (juecesSinParticipar.size()<= this.panamericano.getJueces().size()){
			
			int indiceJuez=(int)Math.floor(Math.random()* juecesSinParticipar.size() ); // o cambiar 4,3,2,1
			juez = this.panamericano.getJuez(indiceJuez);
			cedula = juez.getCedula();
			// seteamos o contamos al juez para indicar que ya participo
			this.panamericano.marcarParticipacionJuez(cedula);
			
		}
		else{
			int indiceJuez=(int)Math.floor(Math.random()* this.panamericano.getJueces().size() ); // o cambiar 4,3,2,1
			juez = this.panamericano.getJuez(indiceJuez);
		}
		
		
		return juez;
		
	}
	
//	private Juez juezAleatorioPanamericano(ArrayList<Juez> jueces){
//		
//		Juez juez;
//		//System.out.println("Cantidad de jueces: "+this.panamericano.cantidadJueces());
//		int indiceJuez=(int)Math.floor(Math.random()* this.panamericano.cantidadJueces() ); // o cambiar 4,3,2,1
//		//System.out.println("Indice juez a intenar selecc : "+indiceJuez);
//		juez = this.panamericano.getJuez(indiceJuez);
//		
//		
//		return juez;
//		
//	}

	
	
	private void ordenarTiempos(ArrayList<NadadorCompetencia> arrayNadadoresCompetencia ){
		
		NadadorCompetencia tempNadadorCompetencia;
		
		tempNadadorCompetencia = new  NadadorCompetencia();
		
		// ordenando por burbuja creciente
		
		boolean interruptor = true;
		
		for (int p=0; p< arrayNadadoresCompetencia.size()-1; p++){
			// cantidad de pasadas
			interruptor = false; // sin intercambios
			
			for (int j =0; j< arrayNadadoresCompetencia.size()-p-1; j++){
				
				if (arrayNadadoresCompetencia.get(j).getTiempo() > arrayNadadoresCompetencia.get(j+1).getTiempo()){
					
					interruptor = true;
					tempNadadorCompetencia = arrayNadadoresCompetencia.get(j);
					arrayNadadoresCompetencia.set(j, arrayNadadoresCompetencia.get(j+1));
					arrayNadadoresCompetencia.set(j+1,tempNadadorCompetencia);

				}
					
				
			} // for 2
			
		} // for 1

		// ya ordenado colocamos la posicion a cada uno de ellos
		for (int i=0; i< arrayNadadoresCompetencia.size(); i++){
			tempNadadorCompetencia = arrayNadadoresCompetencia.get(i);
			tempNadadorCompetencia.setPosicion(i+1);
			arrayNadadoresCompetencia.set(i, tempNadadorCompetencia);
		}
		
	}
	
	
	
	private float calcularTiemporAleatorio_50(){
		// probados con un for de 200 numeros aleatorios
		String decimalConcatenado;
		// entero del 25 al 35
		int entero =(((int)Math.floor(Math.random()* (34-25+1)+25)));
		 
		// random para la parte decimal del 0 al 9999
		int decimal =(int)Math.floor(Math.random()* 9999 );
		
		decimalConcatenado= String.valueOf(entero) + "." + String.valueOf(decimal);
		
		float respuesta = Float.parseFloat(decimalConcatenado);
		
		
		return respuesta;
	}
	
	private float calcularTiemporAleatorio_100(){
		// probados con un for de 200 numeros aleatorios
		String decimalConcatenado;
		// entero del 25 al 35
		int entero =(((int)Math.floor(Math.random()* (64-55+1)+55)));
		 
		// random para la parte decimal del 0 al 9999
		int decimal =(int)Math.floor(Math.random()* 9999 );
		
		decimalConcatenado= String.valueOf(entero) + "." + String.valueOf(decimal);
		
		float respuesta = Float.parseFloat(decimalConcatenado);
		
		
		return respuesta;
		
		
	}
	
	
	private ArrayList<Nadador> separarMasculinos(ArrayList<Nadador> nadadores){
	
		ArrayList<Nadador> masculinos = new ArrayList<Nadador>();
		
		for ( int i =0; i< nadadores.size(); i++ ){
			if(nadadores.get(i).getSexo() == 'M' ){
				masculinos.add(nadadores.get(i));
			}
		}
		
		return masculinos;
		
	}
	
	private ArrayList<Nadador> separarFemeninos(ArrayList<Nadador> nadadores){
		
		ArrayList<Nadador> femeninos = new ArrayList<Nadador>();
		
		for ( int i =0; i< nadadores.size(); i++ ){
			if(nadadores.get(i).getSexo() == 'F' ){
				femeninos.add(nadadores.get(i));
			}
		}
		
		return femeninos;
		
	}

}
